package pers.ree.demo.basic;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class StringDemo {

    public static void testIntern() {
//        String s = "中文字1符s串";
//        System.out.println(System.identityHashCode(s));
//        String s1 = s.intern();
//        System.out.println(System.identityHashCode(s1));

        String s2 = new String("中文字1符s串");
        System.out.println(System.identityHashCode(s2));
        String s3 = s2.intern();
        System.out.println(System.identityHashCode(s3));
        System.out.println(System.identityHashCode(s2));

        String s = "中文字1符s串";
        System.out.println(System.identityHashCode(s));
        String s1 = s.intern();
        System.out.println(System.identityHashCode(s1));

        String s4 = new String("中文字1符s串");
        System.out.println(System.identityHashCode(s4));
        String s5 = s4.intern();
        System.out.println(System.identityHashCode(s5));
        String s6 = "中文字1符s串";
        System.out.println(System.identityHashCode(s6));
    }

    public static void testIntern2() {
        String s = new String("qwe");
        String s1 = "qwe";
        String s2 = new String("qwe");
        System.out.println(System.identityHashCode(s));
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));

        String s3 = s2;
        System.out.println(System.identityHashCode(s3));
        String s4 = s1;
        System.out.println(System.identityHashCode(s4));
    }

    public static void main(String[] args) {
//        testIntern();

//        testIntern2();

        string2ByteArray();
    }

    public static void string2ByteArray() {
        String str = "你好，世界！Hello, world!";
//        str = "ab";

        // 在Mac中默认是按utf-8转换，等价于str.getBytes(StandardCharsets.UTF_8)
        System.out.println(str.getBytes().length);

        // 使用 UTF-8 编码将 String 转换为 byte[]
        byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8);
        System.out.println("UTF-8 Bytes length: " + utf8Bytes.length);
        // Arrays.toString无法将字节数组转换回字符串，其作用见utf16Bytes的注释
        System.out.println("UTF-8 Bytes: " + Arrays.toString(utf8Bytes));
        // new String可以将字节数组转换回字符串
        System.out.println(new String(utf8Bytes));

        // 使用 UTF-16 编码将 String 转换为 byte[]
        byte[] utf16Bytes = str.getBytes(StandardCharsets.UTF_16);
//        // 打印字节数组的长度
//        System.out.println("UTF-16 Byte Array Length: " + utf16Bytes.length);
//        // 打印字节数组的内容
//        System.out.println("UTF-16 Byte Array: " + bytesToHex(utf16Bytes));
//        // 分割 BOM 和实际字符数据
//        byte[] bom = new byte[2];
//        byte[] charData = new byte[utf16Bytes.length - 2];
//        System.arraycopy(utf16Bytes, 0, bom, 0, 2);
//        System.arraycopy(utf16Bytes, 2, charData, 0, utf16Bytes.length - 2);
//        // 打印 BOM
//        System.out.println("BOM: " + bytesToHex(bom));
//        // 打印字符数据
//        System.out.println("Character Data: " + bytesToHex(charData));

        // Arrays.toString无法将字节数组转换回字符串；
        // Arrays.toString(byte[]) 方法确实可以将字节数组转换为一个字符串表示，
        // 但它只是将数组中的每个元素转换为其十进制数值，并用逗号分隔。
        // 这个方法主要用于调试目的，而不是真正的字符串编码转换
        System.out.println("UTF-16 Bytes String: " + Arrays.toString(utf16Bytes));
        // new String可以将字节数组转换回字符串
        System.out.println(new String(utf16Bytes, StandardCharsets.UTF_16));

        // 使用 ISO-8859-1 编码将 String 转换为 byte[]
//        byte[] iso88591Bytes = str.getBytes(StandardCharsets.ISO_8859_1);
//        System.out.println("ISO-8859-1 Bytes length: " + iso88591Bytes.length);
//        System.out.println("ISO-8859-1 Bytes: " + Arrays.toString(iso88591Bytes));

//        String s = "你好，世界！\uD83D\uDE00";
//        System.out.println(s.length());

    }

    // 辅助方法，将 byte 数组转换为十六进制字符串
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b));
        }
        return sb.toString().trim();
    }
}
